/**
 * @addtogroup gps_common
 * gps_common
 * @{
 */
/**
 * @file         gps_common.h
 * @brief        
 * @note    
 * @author       lzl(lzl@hopechart.com，刘沾林)
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author           <th>Description
 * <tr><td>2019-11-21  <td>1.0                   <td>lzl              <td>创建初始版本
 * <tr><td>2020-11-21  <td>1.1                   <td>Akee,(ysk@hopechart.com,尤胜坤) <td>名字从common.h改为gps_common.h
 * <tr><td>2022-10-28  <td>1.2                   <td>Akee,(shengkun.you@hopechart.com,尤胜坤) <td>名字从gps_common.h改为bsc_gps_common.h,所有类型前面加上Bs
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */

#ifndef _BSC_GPS_COMMON_H_
#define _BSC_GPS_COMMON_H_

#include "ofc/ofc_types.h"
#include <stdlib.h>
#include <stdint.h>
#include <time.h>

#ifdef __cplusplus
extern "C" {
#endif

#define BS_GPS_MAX_SVS            32

/*
 * 选用模式
 */
enum TBsGpsFixModeTag 
{
    kBsGpsFixModeNone,
    kBsGpsFixModeUnknown,
    kBsGpsFixModeNotAvailable,
    kBsGpsFixMode2D,
    kBsGpsFixMode3D,
};
typedef enum TBsGpsFixModeTag TBsGpsFixMode;

/*
 * 操作模式
 */
enum TBsBsGpsFixModeTag
{
    kBsGpsOperateModeNone,
    kBsGpsOperateModeUnknown,
    kBsGpsOperateModeAutomatic,
    kBsGpsOperateModeManual,
};
typedef enum TBsBsGpsFixModeTag TBsBsGpsFixMode;

/*
 * 软件启动命令码
 */
enum TBsGpsSoftResetCodeTag 
{
    kBsGpsSoftResetCodeCold = 0,    ///< 不使用初始化信息，清除备份存储中除配置外的所有数据
    kBsGpsSoftResetCodeWarm = 1,    ///< 不使用初始化信息，清除星历
    kBsGpsSoftResetCodeHot  = 2,    ///< 不使用初始化信息，备份存储中的所有数据
};
typedef enum TBsGpsSoftResetCodeTag TBsGpsSoftResetCode;

enum TBsGpsBaudrateTag
{
    kBsGpsBaudrate9600    = 1,
    kBsGpsBaudrate19200   = 2,
    kBsGpsBaudrate38400   = 3,
    kBsGpsBaudrate57600   = 4,
    kBsGpsBaudrate115200  = 5,
    kBsGpsBaudrateCount,
};
typedef enum TBsGpsBaudrateTag TBsGpsBaudrate;

enum TBsGpsBaudrateValTag
{
    kBsGpsBaudrateVal9600    = 9600,
    kBsGpsBaudrateVal19200   = 19200,
    kBsGpsBaudrateVal38400   = 38400,
    kBsGpsBaudrateVal57600   = 57600,
    kBsGpsBaudrateVal115200  = 115200,
};
typedef enum TBsGpsBaudrateValTag TBsGpsBaudrateVal;

/**
 * @brief 定位系统模式
 */
enum TBsGpsPositionSysModeTag 
{
    kBsGpsPositionSysModeNone,           ///< 未设置
    kBsGpsPositionSysModeUnknown,        ///< 未知的定位系统模式
    kBsGpsPositionSysModeAutonomous,     ///< 自主定位模式(可信的)
    kBsGpsPositionSysModeDifferential,   ///< 差分定位模式(可信的)
    kBsGpsPositionSysModeEstimated,      ///< 估算模式(值得怀疑的)
    kBsGpsPositionSysModeManual,         ///< 手动模式
    kBsGpsPositionSysModeSimulator,      ///< 仿真模式
    kBsGpsPositionSysModeNotValid,       ///< 数据不可用
};
typedef enum TBsGpsPositionSysModeTag TBsGpsPositionSysMode;

/**
 * @brief 天线状态枚举
 */
enum TGpsAntennaStatusTag 
{
    kBsGpsAntennaStatusNone,         ///< 初始态
    kBsGpsAntennaStatusNormal,       ///< 正常
    kBsGpsAntennaStatusNotConnected, ///< 未接(开路)
    kBsGpsAntennaStatusShortCircuit, ///< 短路检测
};
typedef enum TGpsAntennaStatusTag TGpsAntennaStatus;

/**
 * @brief Gnss星座系统
 * 最大不得超过7,超过内部要修改 
 */
enum TBsGpsConstellationTag 
{
    kBsGpsConstellationUnknown   = 0, ///< 未知
    kBsGpsConstellationGps       = 1, ///< GPS星座
    kBsGpsConstellationSbas      = 2, ///< SBAS星座
    kBsGpsConstellationGlonass   = 3, ///< Glonass星座
    kBsGpsConstellationQzss      = 4, ///< 日本准天顶卫星系统(Quasi-Zenith Satellite System)
    kBsGpsConstellationBeidou    = 5, ///< 北斗卫星系统
    kBsGpsConstellationGalileo   = 6, ///< 伽利略卫星系统
};
typedef enum TBsGpsConstellationTag TBsGpsConstellation;

enum TBsGpsLocationHasTag
{
    kBsGpsLocationHasLatLong             = (1 << 0),         ///< 经纬度
    kBsGpsLocationHasAltitude            = (1 << 1),         ///< 高程
    kBsGpsLocationHasSpeed               = (1 << 2),         ///< 速度
    kBsGpsLocationHasBearing             = (1 << 3),         ///< 方向
    kBsGpsLocationHasHorizontalAccuracy  = (1 << 4),         ///< 水平精确度
    kBsGpsLocationHasVerticalAccuracy    = (1 << 5),         ///< 垂直精确度
    kBsGpsLocationHasSpeedAccuracy       = (1 << 6),   
    kBsGpsLocationHasBearingAccuracy     = (1 << 7),         ///< 方向
    kBsGpsLocationHasSysMode             = (1 << 8),         ///< 定位系统模式
    kBsGpsLocationHasAntennaStatus       = (1 << 9),         ///< 天线状态
    kBsGpsLocationHasValidStatus         = (1 << 10),        ///< 有效状态
    kBsGpsLocationHasPositionAccuracy    = (1 << 11),        ///< 位置精确度
    kBsGpsLocationHasStationId           = (1 << 12),        ///< 差分参考站ID
    kBsGpsLocationHasFixMode             = (1 << 13),        ///< 选用模式
    kBsGpsLocationHasOperMode            = (1 << 14),        ///< 操作模式
};
typedef enum TBsGpsLocationHasTag TBsGpsLocationHas;

typedef struct TBsGpsLocationTag TBsGpsLocation;
struct TBsGpsLocationTag
{
    size_t size;        ///< 本结构尺寸=sizeof(TBsGpsLocation)
    UInt32 flags;       ///< 标记,有kBsGpsLocationHasXxx按位组成的掩码
    time_t timestamp;   ///< 时间戳(UTC)
    UInt16 ant_status;  ///< 天线状态 见TGpsAntennaStatus
    UInt16 sys_mode;    ///< 定位系统模式 见TBsGpsPositionSysMode
    Int32 latitude;     ///< 纬度(+/-),单位:10^7
    Int32 longitude;    ///< 经度(+/-),单位:10^7
    Int32 altitude;     ///< 海拔(+/-)，单位: cm
    UInt32 speed;       ///< 速度(m/h)
    Int16 bearing;      ///< 前进方位(0.01度)
    Int16 hdop;         ///< 水平精度,单位:0.01米
    Int16 vdop;         ///< 垂直精度,单位:0.01米
    Int16 pdop;         ///< 位置精度,单位:0.01米
    Int32 station_id;   ///< 差分参考站Id
    UInt16 fix_mode;    ///< 选用模式 @ref TBsGpsFixMode
    UInt16 oper_mode;   ///< 操作模式, @ref TBsBsGpsFixMode
};

typedef struct TBsGpsSvInfoTag TBsGpsSvInfo;
struct TBsGpsSvInfoTag
{
    size_t size;

    /** 卫星ID,并非伪随机码 */
    /** 采用PRN+星座基准之和确定,具体基准见空定义 */
    UInt8 svid;

    /** 信噪比 */
    Int32 snr;

    /** 仰角(0~90度) */
    Int32 elevation;

    /** 方位角 */
    Int32 azimuth;
};

typedef struct TBsGpsSvStatusTag TBsGpsSvStatus;
struct TBsGpsSvStatusTag
{
    /** 本结构尺寸=sizeof(TBsGpsSvStatus) */
    size_t size;

    /** 星座,@ref TBsGpsConstellation */
    Int32 constellation;

    Int32 used_num_svs; ///< 参与定位的卫星颗数

    /** 当前可见卫星信息 */
    Int32 num_svs;

    /** 可见卫星数组 */
    TBsGpsSvInfo sv_list[BS_GPS_MAX_SVS];

    /** 表示指示哪些SV的位掩码有星历数据 */
    UInt32 ephemeris_mask;

    /** 表示指示哪些SV的位掩码有年历数据。 */
    UInt32 almanac_mask;

    /** 表示指示哪些SV的位掩码参与定位，对应bit位为1表示卫星参与定位 */
    UInt32 used_in_fix_mask;
};

#ifdef __cplusplus
} // extern "C" {
#endif

#endif

/**
 * @} 
 */
 
 
 
 
 
 
 
 
 
 
 
 


    
